package com.mkx.samples;

import com.mkx.behaviorals.chainofresponsibility.Handler;
import com.mkx.behaviorals.chainofresponsibility.ConcreteHandlerA;
import com.mkx.behaviorals.chainofresponsibility.ConcreteHandlerB;
import com.mkx.behaviorals.chainofresponsibility.ConcreteHandlerC;

/**
 * 责任链模式演示类
 * 用于展示如何构建和使用责任链来处理请求
 */
public class ChainOfResponsibilityDemo {
    
    /**
     * 主方法，演示责任链模式的使用
     * @param args 命令行参数
     */
    public static void main(String[] args) {
        // 创建具体的处理者对象
        Handler handlerA = new ConcreteHandlerA();
        Handler handlerB = new ConcreteHandlerB();
        Handler handlerC = new ConcreteHandlerC();
        
        // 构建责任链
        // 设置 handlerA 的下一个处理者为 handlerB
        handlerA.setSuccessor(handlerB);
        // 设置 handlerB 的下一个处理者为 handlerC
        handlerB.setSuccessor(handlerC);
        // handlerC 是链尾，不需要设置后继者
        
        // 创建一个请求并发送到链的第一个处理者
        System.out.println("====== 测试请求 TypeA ======");
        handlerA.handleRequest("TypeA");
        
        System.out.println("\n====== 测试请求 TypeB ======");
        handlerA.handleRequest("TypeB");
        
        System.out.println("\n====== 测试请求 TypeC ======");
        handlerA.handleRequest("TypeC");
        
        System.out.println("\n====== 测试无法处理的请求 ======");
        handlerA.handleRequest("UnknownType");
        
        // 演示不同的责任链结构
        System.out.println("\n====== 测试不同的责任链结构 ======");
        Handler handlerD = new ConcreteHandlerA();
        Handler handlerE = new ConcreteHandlerC();
        handlerD.setSuccessor(handlerE);
        handlerD.handleRequest("TypeB");
    }
}